package com.xbongbong.sso.service.imp;

import com.xbongbong.paas.enums.DelEnum;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.paas.toolbox.util.DateTimeUtil;
import com.xbongbong.paas.toolbox.wrap.BaseVO;
import com.xbongbong.pro.enums.errorcodes.SsoErrorCodeEnum;
import com.xbongbong.sso.domain.entity.OauthParamEntity;
import com.xbongbong.sso.help.OauthParamHelp;
import com.xbongbong.sso.model.OauthParamModel;
import com.xbongbong.sso.pojo.OauthParamPojo;
import com.xbongbong.sso.pojo.dto.OauthParamAddDTO;
import com.xbongbong.sso.pojo.dto.OauthParamDeleteDTO;
import com.xbongbong.sso.pojo.dto.OauthParamDetailDTO;
import com.xbongbong.sso.pojo.dto.OauthParamListDTO;
import com.xbongbong.sso.pojo.dto.OauthParamUpdateDTO;
import com.xbongbong.sso.pojo.vo.OauthParamAddVO;
import com.xbongbong.sso.pojo.vo.OauthParamDetailVO;
import com.xbongbong.sso.pojo.vo.OauthParamListVO;
import com.xbongbong.sso.pojo.vo.OauthParamUpdateVO;
import com.xbongbong.sso.service.OauthParamService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * 授权参数
 */
@Service("oauthParamService")
public class OauthParamServiceImpl implements OauthParamService {
    private static final Logger LOG = LoggerFactory.getLogger(OauthParamServiceImpl.class);

    @Resource
    private OauthParamModel oauthParamModel;
    @Resource
    private OauthParamHelp oauthParamHelp;

    @Override
    public OauthParamListVO list(OauthParamListDTO oauthParamListDTO) throws XbbException {
        String corpid = oauthParamListDTO.getCorpid();
        Long connectorId = oauthParamListDTO.getConnectorId();
        Long stepId = oauthParamListDTO.getStepId();
        Integer stageType = oauthParamListDTO.getStageType();
        Map<String, Object> param = new HashMap<>();
        param.put("corpid", corpid);
        param.put("connectorId", connectorId);
        param.put("stepId", stepId);
        param.put("stageType", stageType);
        param.put("del", 0);
        List<OauthParamEntity> oauthParams = oauthParamModel.findEntities(param);
        List<OauthParamPojo> list = new ArrayList<>();
        for (OauthParamEntity oauthParam : oauthParams) {
            list.add(oauthParamHelp.oauthParamPojoFormat(oauthParam));
        }
        OauthParamListVO oauthParamListVO = new OauthParamListVO();
        oauthParamListVO.setList(list);
        return oauthParamListVO;
    }


    @Override
    public OauthParamDetailVO detail(OauthParamDetailDTO oauthParamDetailDTO) throws XbbException {
        String corpid = oauthParamDetailDTO.getCorpid();
        Long id = oauthParamDetailDTO.getId();
        OauthParamEntity oauthParam = oauthParamModel.getByKey(id, corpid);
        OauthParamDetailVO oauthParamDetailVO = new OauthParamDetailVO();
        oauthParamDetailVO.setOauthParam(oauthParamHelp.oauthParamPojoFormat(oauthParam));
        return oauthParamDetailVO;
    }

    @Override
    public OauthParamAddVO add(OauthParamAddDTO oauthParamAddDTO) throws XbbException {
        String corpid = oauthParamAddDTO.getCorpid();
        Long connectorId = oauthParamAddDTO.getConnectorId();
        Long stepId = oauthParamAddDTO.getStepId();
        Integer stageType = oauthParamAddDTO.getStageType();
        Integer position = oauthParamAddDTO.getPosition();
        Integer contentType = oauthParamAddDTO.getContentType();
        String attr = oauthParamAddDTO.getAttr();
        String standardAttr = oauthParamAddDTO.getStandardAttr();
        Integer enable = oauthParamAddDTO.getEnable();
        String description = oauthParamAddDTO.getDescription();

        OauthParamEntity oauthParam = new OauthParamEntity();
        oauthParam.setCorpid(corpid);
        oauthParam.setConnectorId(connectorId);
        oauthParam.setStepId(stepId);
        oauthParam.setStageType(stageType);
        oauthParam.setPosition(position);
        oauthParam.setAttr(attr);
        oauthParam.setStandardAttr(standardAttr);
        oauthParam.setEnable(enable);
        oauthParam.setDescription(description);
        oauthParamModel.insert(oauthParam);
        OauthParamAddVO oauthParamAddVO = new OauthParamAddVO();
        oauthParamAddVO.setDataId(oauthParam.getId());
        return oauthParamAddVO;
    }

    @Override
    public OauthParamUpdateVO update(OauthParamUpdateDTO oauthParamUpdateDTO) throws XbbException {
        Long id = oauthParamUpdateDTO.getId();
        String corpid = oauthParamUpdateDTO.getCorpid();
        Integer stageType = oauthParamUpdateDTO.getStageType();
        Integer position = oauthParamUpdateDTO.getPosition();
        String attr = oauthParamUpdateDTO.getAttr();
        String standardAttr = oauthParamUpdateDTO.getStandardAttr();
        Integer enable = oauthParamUpdateDTO.getEnable();
        String description = oauthParamUpdateDTO.getDescription();
        OauthParamEntity oauthParam = new OauthParamEntity();
        oauthParam.setId(id);
        oauthParam.setCorpid(corpid);
        oauthParam.setStageType(stageType);
        oauthParam.setPosition(position);
        oauthParam.setAttr(attr);
        oauthParam.setStandardAttr(standardAttr);
        oauthParam.setEnable(enable);
        oauthParam.setDescription(description);
        oauthParam.setUpdateTime(DateTimeUtil.getInt());
        oauthParamModel.update(oauthParam);
        OauthParamUpdateVO oauthParamUpdateVO = new OauthParamUpdateVO();
        oauthParamUpdateVO.setDataId(oauthParam.getId());
        return oauthParamUpdateVO;
    }

    @Override
    public BaseVO delete(OauthParamDeleteDTO oauthParamDeleteDTO) throws XbbException {
        Long id = oauthParamDeleteDTO.getId();
        String corpid = oauthParamDeleteDTO.getCorpid();
        OauthParamEntity oauthParam = oauthParamModel.getByKey(id, corpid);
        if (Objects.isNull(oauthParam) || !Objects.equals(oauthParam.getDel(), DelEnum.NORMAL.getDel())) {
            throw new XbbException(SsoErrorCodeEnum.API_ERROR_273003.getCode(), SsoErrorCodeEnum.API_ERROR_273003.getMsg());
        }
        oauthParamModel.delete(id, corpid);
        return new BaseVO();
    }
}
